package com.imagepicker.testing; import android.app.Activity; import android.content.pm.PackageManager; import android.net.Uri; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.JavaOnlyArray; import com.facebook.react.bridge.JavaOnlyMap; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.common.build.ReactBuildConfig; import com.imagepicker.ImagePickerModule; import com.imagepicker.R; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.rule.PowerMockRule; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.android.controller.ActivityController; import org.robolectric.annotation.Config; import java.io.File; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.when; /** * Created by rusfearuth on 10.04.17. */ @RunWith(RobolectricTestRunner.class) @SuppressStaticInitializationFor("com.facebook.react.common.build.ReactBuildConfig") @PrepareForTest({Arguments.class}) @PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) @Config(manifest = Config.NONE) public class ImagePickerModuleTest { private static final int DEFAULT_THEME = R.style.DefaultExplainingPermissionsTheme; @Rule public PowerMockRule rule = new PowerMockRule(); private ActivityController<Activity> activityController; private Activity activity; private ReactApplicationContext reactContext; private TestableImagePickerModule module; @Before public void setUp() throws Exception { nativeMock(); activityController = Robolectric.buildActivity(Activity.class); activity = activityController.create().start().resume().get(); reactContext = mock(ReactApplicationContext.class); module = new TestableImagePickerModule(reactContext, DEFAULT_THEME); assertNotNull("Module was created", module); when(reactContext.getCurrentActivity()).thenReturn(activity); } @After public void tearDown() { activityController.pause().stop().destroy(); activity = null; } @Test public void testCancelTakingPhoto() { final SampleCallback callback = new SampleCallback(); module.setCallback(callback); module.setCameraCaptureUri(Uri.fromFile(new File(""))); module.onActivityResult(activity, ImagePickerModule.REQUEST_LAUNCH_IMAGE_CAPTURE, Activity.RESULT_CANCELED, null); assertFalse("Camera's been launched", callback.hasError()); assertTrue("User's cancelled of taking a photo", callback.didCancel()); } private void nativeMock() { PowerMockito.mockStatic(Arguments.class); when(Arguments.createArray()).thenAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return new JavaOnlyArray(); } }); when(Arguments.createMap()).thenAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return new JavaOnlyMap(); } }); } }